``` #include <shadow.h> #include <stdio.h> #include <errno.h> int main(void) { errno = 0; struct spwd *s = getspnam("root"); /* 普通用户此处失败:openat返回EACCES(13) */ if (s == NULL) { if (errno == EACCES) printf("权限不足,无法读取影子库\n"); return 1; } return 0; } ``` 链路:`getspnam()` → glibc 置 `rax=257`(openat)尝试打开 `/etc/shadow` → 内核按文件 `0400` 与属主 root 校验进程 `cred` 中的有效 UID:非 0 则返回 `-EACCES`,glibc 置 `errno=EACCES` 并返回 NULL。只有有效 UID 为 0(root,或以 root 身份运行的 SUID 程序内)才继续 `read(0)